home *** CD-ROM | disk | FTP | other *** search
- /*
- * the class EDIT_PULL
- * Copyright (C) 1996, 1997 Kazutaka Hirata <khirata@jove.acs.unt.edu>
- */
-
- #include "../stdafx.h"
-
- #include "../common/bool.h"
- #include "edpull.h"
-
- #include "edpull.h"
-
- STAGE* EDIT_PULL::init_new(KBAN_INFO& info, KBAN_DRAW& draw)
- {
- return new STAGE_SELECT;
- }
-
- const char* EDIT_PULL::get_name(void)
- {
- return "Edit:Pull";
- }
-
- void EDIT_PULL::STAGE_SELECT::collect_pull_lines(const XY& ac_target, LINE_LIST& llist, LINE_P_LIST& plist)
- {
- LINE_LIST::iterator i;
- TRAVERSE(llist, i) {
- if((ac_target == i->ac_s()) || (ac_target == i->ac_e())) {
- LINE_ELEMENT_P element(&*i);
- plist.push_back(element);
- }
- }
- }
-
- STAGE* EDIT_PULL::STAGE_SELECT::mouse_left_down(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- PRIMITIVE& primitive = info.kban_data().primitive();
- LINE_LIST& line_list = primitive.layer(info.active_layer().get()).line_list();
- XY ac;
- GRID& grid = info.grid();
- grid.xy_pc2ac_with_snap_off(pc, ac);
- STAGE* ret = this;
-
- // can I pull?
- for(XYT pc_eps = 0; pc_eps < 20; pc_eps++) {
- XYT ac_eps = grid.distance_pc2ac(pc_eps);
- if(line_list.is_there_nearest_point(ac_eps, ac)) {
- XY ac_target = line_list.search_nearest_point(ac_eps, ac);
- LINE_P_LIST plist;
- collect_pull_lines(ac_target, line_list, plist);
- ret = new STAGE_PULL(ac_target, info.active_layer().get(), plist);
- break;
- }
- }
-
- if(ret == this) {
- // can I divide?
- XYT eps = grid.distance_pc2ac(20);
- LINE_ELEMENT* target = line_list.search(eps, ac);
- if(target != NULL) {
- ret = new STAGE_DIVIDE(target, info.active_layer().get());
- } else {
- ret = this;
- }
- }
-
- return ret;
- }
-
- STAGE* EDIT_PULL::STAGE_SELECT::mouse_right_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- return NULL;
- }
-
- EDIT_PULL::STAGE_PULL::STAGE_PULL(const XY &ac, uint layer, const LINE_P_LIST& list)
- : STAGE_PULL_CORE(ac, layer, list)
- {
- }
-
- STAGE* EDIT_PULL::STAGE_PULL::mouse_left_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- STAGE_PULL_CORE::mouse_left_up(info, draw, pc, nFlags);
- return new STAGE_SELECT;
- }
-
- STAGE* EDIT_PULL::STAGE_PULL::mouse_right_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- STAGE_PULL_CORE::mouse_right_up(info, draw, pc, nFlags);
- return new STAGE_SELECT;
- }
-
- EDIT_PULL::STAGE_DIVIDE::STAGE_DIVIDE(LINE_ELEMENT* target, uint layer)
- : STAGE_DIVIDE_CORE(target, layer)
- {
- }
-
- STAGE* EDIT_PULL::STAGE_DIVIDE::mouse_left_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- STAGE_DIVIDE_CORE::mouse_left_up(info, draw, pc, nFlags);
- return new STAGE_SELECT;
- }
-
- STAGE* EDIT_PULL::STAGE_DIVIDE::mouse_right_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
- {
- STAGE_DIVIDE_CORE::mouse_right_up(info, draw, pc, nFlags);
- return new STAGE_SELECT;
- }
-